#pragma once

#include <cstdint>

namespace thd {

enum Functions: std::uint16_t {
  tensorConstruct,
  tensorConstructWithSize,
  tensorFree,
  tensorResize,
  tensorResizeAs,
  tensorResize1d,
  tensorResize2d,
  tensorResize3d,
  tensorResize4d,
  tensorResize5d,
  tensorSet,
  tensorSetStorage,
  tensorSetStorage1d,
  tensorSetStorage2d,
  tensorSetStorage3d,
  tensorSetStorage4d,
  tensorNarrow,
  tensorSelect,
  tensorTranspose,
  tensorUnfold,
  tensorFill,
  tensorGather,
  tensorScatter,
  tensorScatterFill,
  tensorDot,
  tensorMinall,
  tensorMaxall,
  tensorSumall,
  tensorProdall,
  tensorNeg,
  tensorCinv,
  tensorAdd,
  tensorSub,
  tensorMul,
  tensorDiv,
  tensorFmod,
  tensorRemainder,
  tensorClamp,
  tensorCadd,
  tensorCsub,
  tensorCmul,
  tensorCpow,
  tensorCdiv,
  tensorCfmod,
  tensorCremainder,
  tensorAddcmul,
  tensorAddcdiv,
  tensorAddmv,
  tensorAddmm,
  tensorAddr,
  tensorAddbmm,
  tensorBaddbmm,
  tensorMatch,
  tensorNumel,
  tensorMax,
  tensorMin,
  tensorKthvalue,
  tensorMode,
  tensorMedian,
  tensorSum,
  tensorProd,
  tensorCumsum,
  tensorCumprod,
  tensorSign,
  tensorTrace,
  tensorCross,
  tensorCmax,
  tensorCmin,
  tensorCmaxValue,
  tensorCminValue,

  // storage functions
  storageSet,
  storageGet,

  storageConstruct,
  storageConstructWithSize,
  storageConstructWithSize1,
  storageConstructWithSize2,
  storageConstructWithSize3,
  storageConstructWithSize4,

  storageFree,
  storageResize,
  storageFill,

  // communication requests
  sendTensor,
  sendStorage,
};

} // namespace thd
